package com.wangzz.mallchat.common.common.thread;

import lombok.AllArgsConstructor;

import java.util.concurrent.ThreadFactory;

/**
 * 通过装饰器模式，对spring提供的线程池增加异常日志打印
 */
@AllArgsConstructor // 加上构造方法，能传进来需要装饰的类
public class MyThreadFactory implements ThreadFactory {  // 装饰器模式 如果是继承那么就用super调用

    // 多个线程池可以使用同一个错误日志记录，没必要每次都new一个
    private static final MyUncaughtExceptionHandler UNCAUGHT_EXCEPTION_HANDLER = new MyUncaughtExceptionHandler();

    // 使用了线程工厂的类
    private ThreadFactory original;

    @Override
    public Thread newThread(Runnable r) {
        // 执行使用了spring线程池自己逻辑
        Thread thread = original.newThread(r);
        // 添加我们自己的逻辑
        thread.setUncaughtExceptionHandler(UNCAUGHT_EXCEPTION_HANDLER);
        return thread;
    }
}
